forked from ARMmbed/mbed-os
-
Notifications
You must be signed in to change notification settings - Fork 20
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add CompositeEMAC and use it to rewrite STM32 Ethernet MAC driver #438
Merged
+12,352
−4,634
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
d17f6ab
to
404fdd4
Compare
Make progress on driver More progress, but I realized that I can't free packets from an ISR... Driver building, now I can start testing... Add CompositeEthMac MAC boots and can send! Rx not working yet though Sending and receiving sort of working! Clean up CTP code to use structs Fix dumb cache and off by one issues with Rx Fix a couple memory issues, making progress... Fix double free when transmission uses more than 1 descriptor Start adding multicast support Making progress on multicast support Multicast filter working! Tests passing! Improve mcast filter test
11f9bc7
to
997ae9c
Compare
JohnK1987
reviewed
Mar 13, 2025
connectivity/drivers/emac/TARGET_STM/TARGET_STM32F7/TARGET_NUCLEO_F746ZG/stm32f7_eth_init.c
Outdated
Show resolved
Hide resolved
JohnK1987
reviewed
Mar 18, 2025
- Broken check in Tx DMA meant it was always copying packets - Tx DMA would assert fail from trying to free nullptr if an allocation failed during packet copy - Rx DMA would not reset firstDescIdx after seeing an error descriptor, leading to an attempt to receive a 0 length packet about 20% of the time we ran the EMAC memory test
…disabling input memory, and errors out if the MAC was working when it shouldn't've been.
JohnK1987
approved these changes
Mar 27, 2025
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary of changes
This PR introduces a new framework for writing Ethernet MAC drivers. The existing EMAC interface requires MAC drivers to implement quite a lot of the specifics of memory management, MAC address tracking, and DMA themselves, even though quite a bit of this logic is common to all MAC drivers. This has led to duplicated code, and quite often to half-assed code as well as chip vendors have struggled to conform to the (admittedly not very well defined) EMAC API.
CompositeEMAC should make this a thing of the past. It's a class which implements the EMAC API and delegates its duties to four subclasses:
The first three of those classes are provided by the chip-specific EMAC driver, while the fourth comes from a library of PHY drivers and is not MCU specific. But this way most of the tough logic can be done in the non-MCU-specific layer, and all that needs to be done on a per-MCU basis is writing the low level MAC driver and low level code to interact with Ethernet descriptors.
See detailed documentation here: https://github.com/mbed-ce/mbed-os/blob/dev/stm32-emac-rewrite/connectivity/drivers/emac/CompositeEMAC.md
Impact of changes
Migration actions required
If you have a custom target for an STM32 board with Ethernet support, you will need to update your stm32_eth_init.c. The following changes were made to these files in this PR:
void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)
renamed tovoid EthInitPinmappings(void)
void HAL_ETH_MspDeInit(ETH_HandleTypeDef *heth)
renamed tovoid EthDeinitPinmappings()
void stm32_eth_init_weak_symbol_helper()
removed, no longer neededPinName EthGetPhyResetPin(void)
. This should return the GPIO pin connected to the phy reset line. If there is none, then it should return NC and a software reset will be used instead.Here's an example of the changes: https://github.com/mbed-ce/mbed-os/pull/438/files#diff-7902496d820b51eb5e98851cbbe5cfcb5b2b68ef7af6d9a8e2650d2ada37ab4c
Documentation
Pull request type
Test results
Successfully ran EMAC and netsocket tests on STM32H563 and STM32F429ZI. Only failures are the nanostack ones (which are known broken at present).